#include <iostream>
#include <cstring>

class MyClass {
private:
    char* data;
public:
    // 默认构造函数
    MyClass() : data(nullptr) {
        std::cout << "Default Constructor called." << std::endl;
        data = new char[100];
        std::strcpy(data, "Default data");
    }

    // 带参数的构造函数
    MyClass(const char* input) : data(nullptr) {
        std::cout << "Parameterized Constructor called." << std::endl;
        data = new char[strlen(input) + 1];
        std::strcpy(data, input);
    }

    // 拷贝构造函数
    MyClass(const MyClass& other) : data(nullptr) {
        std::cout << "Copy Constructor called." << std::endl;
        // 深拷贝
        data = new char[strlen(other.data) + 1];
        std::strcpy(data, other.data);
    }

    // 虚析构函数
    virtual ~MyClass() {
        std::cout << "Destructor called." << std::endl;
        delete[] data;
    }

    // 打印数据成员
    void print() const {
        std::cout << "Data: " << data << std::endl;
    }
};

int main() {
    // 使用默认构造函数
    MyClass obj1; // default constructor 
    obj1.print();

    // 使用带参数的构造函数
    MyClass obj2("Custom data");// parameterized constructor called
    obj2.print();

    // 使用拷贝构造函数
    MyClass obj3(obj2);//cope
    obj3.print();

    // 当 obj1, obj2, obj3 超出作用域时，析构函数会被自动调用
    return 0;
}